package com.ccovo.controller;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.ccovo.domain.R;
import com.ccovo.domain.constants.Constants;
import com.ccovo.domain.po.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

@RestController
@RequiredArgsConstructor
@Api(tags = "Session会话接口")
@RequestMapping("/session")
public class SessionController {

    /**
     * 在 Sa-Token 中，Session 分为三种，分别是：
     * Account-Session: 指的是框架为每个 账号id 分配的 Session
     * Token-Session: 指的是框架为每个 token 分配的 Session
     * Custom-Session: 指的是以一个 特定的值 作为SessionId，来分配的 Session
     *
     * SaSession 与 HttpSession 没有任何关系，在HttpSession上写入的值，在SaSession中无法取出
     * HttpSession并未被框架接管，在使用Sa-Token时，请在任何情况下均使用SaSession，不要使用HttpSession
     */

    // 简单存取值   ---- http://localhost:8080/session/getValue
    @GetMapping("getValue")
    public SaResult getValue() {
        // 获取当前登录账号的专属 SaSession 对象
        // 		注意点1：只有登录后才可以调用这个方法
        //		注意点2：每个账号获取到的都是不同的 SaSession 对象，存取值时不会互相影响
        //		注意点3：SaSession 和 HttpSession 是两个完全不同的对象，不可混淆使用
        SaSession session = StpUtil.getSession();

        // 存值
        session.set("name", "zhangsan");
        session.set("age", 18);

        // 取值
        Object name = session.get("name");
        String name2 = session.getString("name");   // 取值，并转化为 String 数据类型
        int age = session.getInt("age");	// 转 int 类型
        long age2 = session.getLong("age");	// 转 long 类型
        float age3 = session.getFloat("age");	// 转 float 类型
        double age4 = session.getDouble("age");	// 转 double 类型
        int age5 = session.get("age5", 22);  // 取不到时就返回默认值
        int age6 = session.get("age5", () -> {  // 取不到时就执行 lambda 获取值
            return 26;
        });

        /*
         * 存取值范围是一次会话有效的，也就是说，在一次登录有效期内，你可以在一个请求里存值，然后在另一个请求里取值
         */

        List<Object> list = Arrays.asList(name, name2, age, age2, age3, age4, age5, age6);
        System.out.println(list);

        return SaResult.data(list);
    }

    // 复杂存取值   ---- http://localhost:8080/session/getModel
    @GetMapping("getModel")
    public SaResult getModel() {
        // 实例化
        User user = new User();
        user.setId(10001L);
        user.setName("张三");
        user.setRole(Constants.ADMIN);

        // 写入这个对象到 SaSession 中
        StpUtil.getSession().set("user", user);

        // 然后我们就可以在任意代码处获取这个 user 了
        User user2 = StpUtil.getSession().getModel("user", User.class);

        // 返回
        return SaResult.data(user2);
    }

    // 自定义Session   ---- http://localhost:8080/session/customSession
    @GetMapping("customSession")
    public SaResult customSession() {

        // 自定义 Session 就是指使用一个特定的 key，来获取 Session 对象
        SaSession roleSession = SaSessionCustomUtil.getSessionById("role-1001");

        // 一样可以自由的存值写值
        roleSession.set("nnn", "lalala");
        System.out.println(roleSession.get("nnn"));

        // 返回
        return SaResult.ok();
    }


}
